﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
using System.Data;
using System.IO;
using System.Web.UI;
using ExcelLibrary.SpreadSheet;
using System.Text;
using MySql.Data.MySqlClient;

/// <summary>
/// Summary description for ChamadosDAO
/// </summary>
public class ChamadosDAO : Banco
{
    public Chamados Chamado;

    private string Sql =
    "SELECT chamados.codigo AS Codigo, chamados.solicitante AS Usuario, chamados.estacao AS Estacao, " +
    "chamados.assunto AS Assunto, situacao.descricao AS Situacao, " +
    "prioridade.descricao AS Prioridade, chamados.data_abertura AS DataAbertura, tecnicos.nome AS Tecnico, chamados.reclamacao AS Reclamacao, " +
    "chamados.solucao AS Solucao, chamados.login_solicitante AS Login, chamados.hora_fechamento " +
    "AS HoraFechamento, chamados.hora_abertura AS HoraAbertura, " +
    "chamados.data_fechamento AS DataFechamento FROM chamados INNER JOIN " +
    "situacao ON chamados.Situacao_codigo = situacao.codigo INNER JOIN " +
    "prioridade ON chamados.Prioridade_codigo = prioridade.codigo INNER JOIN " +
    "tecnicos ON chamados.Tecnicos_codigo = tecnicos.login";

    /// <summary>
    /// Construtor vazio
    /// </summary>
    public ChamadosDAO()
    {

    }
    /// <summary>
    /// Construtor que instancia um chamado.
    /// </summary>
    /// <param name="Chamado">Objeto chamado ja instanciado.</param>
    public ChamadosDAO(Chamados Chamado)
    {
        this.Chamado = Chamado;
    }
    /// <summary>
    /// Persiste chamado no banco.
    /// </summary>
    /// <returns>Status da requisição.</returns>
    public bool Salvar()
    {
        return Comando("INSERT INTO chamados (solicitante, reclamacao, data_abertura, hora_abertura, login_solicitante, assunto, Prioridade_codigo, Tecnicos_codigo, Situacao_codigo, estacao, urlimagem)" +
        "VALUES ('" + Chamado.Solicitante + "', '" + Chamado.Reclamacao + "', '" + Chamado.DataAbertura.ToString("yyyy/MM/dd") + "', '" + Chamado.HoraAbertura + "', '" + Chamado.LoginSolicitante +
        "', '" + Chamado.Assunto + "', " + Chamado.Prioridade.Codigo + ", '" + Chamado.Tecnico.Login + "', " + Chamado.Situacao.Codigo + ", '" + Chamado.Estacao.ToUpper() + "', '" + Chamado.UrlImagem + "')");
    }
    /// <summary>
    /// Encerra chamado aberto.
    /// </summary>
    /// <returns>Status da requisição.</returns>
    public bool EncerrarChamado()
    {
        return Comando("UPDATE chamados SET data_fechamento = '" + Chamado.DataFechamento + "', hora_fechamento = '" + Chamado.HoraFechamento + "', solucao = '" + Chamado.Solucao + "', situacao = " + Chamado.Situacao.Codigo +
        "  WHERE (chamados.codigo = " + Chamado.Codigo + ")");
    }
    /// <summary>
    /// Popula DropDownList com situações, excluindo a situação encerrado.
    /// </summary>
    /// <param name="Ddl">DropDownList a ser populada.</param>
    public void DropDownList(DropDownList Ddl)
    {
        DropDownList(Ddl, "SELECT codigo, descricao FROM situacao  WHERE codigo <> 3");
    }
    /// <summary>
    /// Popula DropDownList com situações.
    /// </summary>
    /// <param name="Ddl">DropDownList a ser populada.</param>
    public void DropDownListSit(DropDownList Ddl)
    {
        DropDownList(Ddl, "SELECT codigo, descricao FROM situacao");
    }
    /// <summary>
    /// Retorna DataTable com chamados filtrados por Mes.
    /// </summary>
    /// <param name="Mes">Mes para filtra ex: 1 = janeiro; 2 = fevereiro</param>
    /// <returns>DataTable com chamados filtrados.</returns>
    public DataTable FiltroChamadosMes(string Mes)
    {
        Sql = Sql + "  WHERE (MONTH(chamados.data_abertura) = " + Mes + ")";
        return Busca_Banco(Sql + " ORDER BY DataAbertura DESC");
    }
    /// <summary>
    /// Retorna DataTable com chamados filtrados por Ano.
    /// </summary>
    /// <param name="Ano">Ano em numeros --> 2011; 2010.</param>
    /// <returns>DataTable com chamados filtrados.</returns>
    public DataTable FiltroChamadosAno(string Ano)
    {
        Sql = Sql + " WHERE (YEAR(chamados.data_abertura) = " + Ano + ")";
        return Busca_Banco(Sql + " ORDER BY DataAbertura DESC");
    }
    /// <summary>
    /// Retorna DataTable com chamados filtrados por Ano.
    /// </summary>
    /// <param name="Ano">Ano em numeros --> 2011; 2010.</param>
    /// <param name="Mes">Mes para filtra ex: 1 = janeiro; 2 = fevereiro</param>
    /// <returns>DataTable com chamados filtrados.</returns>
    public DataTable FiltroChamadoAnoMes(string Ano, string Mes)
    {
        Sql = Sql + "  WHERE (YEAR(chamados.data_abertura) = " + Ano + ") AND (MONTH(chamados.data_abertura) = " + Mes + ")";
        return Busca_Banco(Sql + " ORDER BY DataAbertura DESC");
    }
    /// <summary>
    /// Busca todos chamados.
    /// </summary>
    /// <returns>DataTable com chamados.</returns>
    public DataTable TodosChamados()
    {
        return Busca_Banco(Sql + " ORDER BY DataAbertura DESC");
    }
    /// <summary>
    /// Filtro que retorna um data table.
    /// </summary>
    /// <param name="Campo">Campo para filtrar</param>
    /// <param name="Filtro"></param>
    /// <param name="Continuo"></param>
    /// <returns></returns>
    public DataTable FiltroLIKE(string Campo, string Filtro, bool Continuo)
    {
        if (Continuo)
            Sql = Sql + " AND (" + Campo + " LIKE '" + Filtro.Trim() + "%')";
        else
            Sql = Sql + "  WHERE (" + Campo + " LIKE '" + Filtro.Trim() + "%')";

        return Busca_Banco(Sql + " ORDER BY DataAbertura DESC");
    }
    /// <summary>
    /// Filtro com sinal de igual que retorna um data table.
    /// </summary>
    /// <param name="Campo">Campo para filtrar</param>
    /// <param name="Filtro">Valor para filtrar</param>
    /// <param name="Continuo">true para usar AND, false para usar  WHERE</param>
    /// <returns>Data table filtrado</returns>
    public DataTable FiltroIGUAL(string Campo, string Filtro, bool Continuo)
    {
        if (Continuo)
            Sql = Sql + " AND (" + Campo + " = '" + Filtro.Trim() + "')";
        else
            Sql = Sql + "  WHERE (" + Campo + " = '" + Filtro.Trim() + "')";

        return Busca_Banco(Sql + " ORDER BY DataAbertura DESC");
    }
    /// <summary>
    /// Classe para exportar para excel
    /// </summary>
    /// <param name="Dt">DataTable para ser exportado</param>
    public void Exportar(DataTable Dt)
    {
        HttpContext.Current.Response.ContentEncoding = Encoding.GetEncoding("Windows-1252");
        HttpContext.Current.Response.Charset = "UTF-8";


        //Conteúdo do Response
        HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=DocumentoExcel.xls");
        HttpContext.Current.Response.Charset = "";
        HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";


        //Objetos
        StringWriter stringWrite = new System.IO.StringWriter();
        HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);

        //Inclui controles 
        GridView dgDados = new GridView();
        //HttpContext.Current.Controls.Add(dgDados);

        //Definição de cores      
        dgDados.DataSource = Dt;
        dgDados.DataBind();

        for (int i = 0; i < dgDados.Rows.Count; i++)
        {
            dgDados.Rows[i].Cells[6].Text = dgDados.Rows[i].Cells[6].Text.Remove(10);

            try
            {
                dgDados.Rows[i].Cells[13].Text = dgDados.Rows[i].Cells[13].Text.Remove(10);
            }
            catch
            {
                dgDados.Rows[i].Cells[13].Text = "";
            }

            dgDados.Rows[i].HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Left;

        }

        dgDados.HeaderRow.Cells[1].Text = "Usuário";
        dgDados.HeaderRow.Cells[2].Text = "Estação";
        dgDados.HeaderRow.Cells[3].Text = "Assunto";
        dgDados.HeaderRow.Cells[4].Text = "Situação";
        dgDados.HeaderRow.Cells[5].Text = "Prioridade";
        dgDados.HeaderRow.Cells[6].Text = "Data de Abertura";
        dgDados.HeaderRow.Cells[7].Text = "Técnico";
        dgDados.HeaderRow.Cells[8].Text = "Reclamação";
        dgDados.HeaderRow.Cells[9].Text = "Solução";
        dgDados.HeaderRow.Cells[10].Text = "Login";
        dgDados.HeaderRow.Cells[11].Text = "Hora do Fechamento";
        dgDados.HeaderRow.Cells[12].Text = "Hora de Abertura";
        dgDados.HeaderRow.Cells[13].Text = "Data do Fechamento";



        //Renderiza o DataGrid
        dgDados.RenderControl(htmlWrite);

        //Exporta 
        HttpContext.Current.Response.Write(stringWrite.ToString());

        //encerra
        HttpContext.Current.Response.End();
    }
    /// <summary>
    /// Busca um chamado em banco.
    /// </summary>
    /// <param name="Codigo">Codigo do chamado a ser buscado.</param>
    /// <returns>Objeto preenchido.</returns>
    public Chamados DetalhesChamado(int Codigo)
    {
        Chamado = new Chamados();
        string sql = "SELECT codigo, solicitante, reclamacao, data_abertura, data_fechamento, hora_abertura, hora_fechamento, login_solicitante, assunto, Prioridade_codigo, Tecnicos_codigo, " +
        "Situacao_codigo, estacao, solucao, urlimagem FROM chamados  WHERE (codigo = " + Codigo + ")";
        MySqlConnection conection = new MySqlConnection(conexao);
        MySqlCommand comando = new MySqlCommand(sql, conection);

        MySqlDataReader dtreader;
        conection.Open();
        dtreader = comando.ExecuteReader();

        if (dtreader.HasRows)
        {
            while (dtreader.Read())
            {
                Chamado.Codigo = Convert.ToInt32(dtreader["codigo"].ToString());
                Chamado.Solicitante = dtreader["solicitante"].ToString();
                Chamado.Reclamacao = dtreader["reclamacao"].ToString();
                Chamado.DataAbertura = dtreader.GetDateTime("data_abertura");
                Chamado.DataFechamento = dtreader.GetDateTime("data_abertura");
                Chamado.HoraAbertura = dtreader["hora_abertura"].ToString();
                Chamado.HoraFechamento = dtreader["hora_fechamento"].ToString();
                Chamado.LoginSolicitante = dtreader["login_solicitante"].ToString();
                Chamado.Assunto = dtreader["assunto"].ToString();
                Chamado.Tecnico = new Tecnico { Codigo = dtreader.GetInt32("Tecnicos_codigo") };
                Chamado.Situacao = new Situacao { Codigo = dtreader.GetInt32("Situacao_codigo") };
                Chamado.Prioridade = new Prioridade { Codigo = dtreader.GetInt32("Prioridade_codigo") };
                Chamado.Estacao = dtreader["estacao"].ToString();
                Chamado.Solucao = dtreader["solucao"].ToString();
                Chamado.UrlImagem = dtreader["urlimagem"].ToString();
            }
        }
        conection.Close();
        return Chamado;
    }
}